package com.task.core.service;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import com.task.core.domain.DataImportHeadInfo;
import com.task.core.domain.DataOperationInfo;
import com.task.core.domain.DeviceInfo;
import com.task.core.domain.ExportFileInfo;
import com.task.core.domain.MissionInfo;
import com.task.core.domain.info.DataHistoryImportInfo;
import com.task.core.domain.info.DataImportProgress;
import com.task.core.domain.info.SourceConfig;
import com.task.core.dto.request.ClientMissionCompleteRequestDTO;
import com.task.core.dto.request.DataOperationRequestDTO;
import com.task.core.dto.request.ExportFileRequestDTO;
import com.task.core.dto.response.DataSearchResponseDTO;

/**
 * @author 迪迦.
 * @date 2024/11/11 13:51
 */
public interface DataOperationService {

  /**
   * 获取没有用过的数据.
   * @param limit 分页大小
   * @param dataSourceCodeList  数据源code集合
   * @param dataType  数据类型
   * @return  数据信息
   */
  List<DataOperationInfo> getNotUseData(int limit, List<String> dataSourceCodeList,
      String dataType);

  /**
   * 根据数据id获取数据详情
   * @param dataId  数据id,第一位是分表,0代表10
   * @param tableName 表名
   * @param dataType  数据类型
   * @param tNum  分表编号
   * @return 单条数据详情
   */
  DataOperationInfo getDataById(String dataId, String tableName, String dataType, int tNum);

  /**
   * 修改数据使用状态
   * @param code  数据code
   * @param status  使用状态
   * @param tableName 表名
   * @param sourceCode  数据源code
   * @param dataType  数据类型
   */
  void changeDataStatusById(String code, boolean status, String tableName, String sourceCode,
      String dataType);

  /**
   * 重置数据状态
   *
   * @param dataId dataId
   */
  void initDataStatus(String dataId, String dataType, String sourceCode);

  DataSearchResponseDTO getDataByPage(DataOperationRequestDTO request);

  /**
   * 根据fileCode删除数据
   *
   * @param fileCode       文件code
   * @param datasourceCode 数据源code,有的话就需要更新datasourceCode表count字段
   */
  void deleteByFileCode(String fileCode, String datasourceCode, String dataType);

  List<DataOperationInfo> getDataByPageOld(DataOperationRequestDTO request);

  /**
   * 导出数据
   * @param request 请求参数实体
   * @param fileCode  导出时使用的文件表头
   * @param userName  用户名,用来生成文件名称
   */
  void exportData(DataOperationRequestDTO request, String fileCode, String userName) throws IOException;

  /**
   * 获取符合条件的所有数据总数
   * @param request 请求参数
   * @return  总数
   */
  List<Integer> getAllDataCount(DataOperationRequestDTO request);

  /**
   * 获取到处文件的所有记录
   * @param request 请求参数
   * @return  分页数据集合
   */
  List<ExportFileInfo> getExportFiles(ExportFileRequestDTO request);

  /**
   * 更新导出文件下载状态
   * @param code  文件code
   * @param status  下载状态
   */
  void updateDownloadStatus(String code, boolean status);

  List<DataHistoryImportInfo> getImportHistory(DataOperationRequestDTO request);

  void clearSuccessRecord(List<String> fileCodes);

  /**
   * 数据失败表+1
   * @param missionCode 任务code
   * @param dataCode  数据code
   * @param tNum  表编号
   * @param dateType  数据类型
   */
  void dataUseFailedIncrement(String missionCode, String dataCode, String tNum,
      String dateType);

  /**
   * 添加数据发送索引表
   * @param mission 任务详情
   * @param dataCode  数据code
   * @param indexTableCode  记录表code
   * @param dateFormat  格式化后的时间
   * @param sourceConfig  数据源配置
   */
  void insertHistoryDataGetIndex(MissionInfo mission, String dataCode,
      String indexTableCode, String dateFormat, SourceConfig sourceConfig);

  /**
   * 删除数据发送索引表记录
   * @param indexTableCode  索引表记录code
   * @param dateFormat  格式化后的时间
   */
  void deleteHistoryDataGetIndex(String indexTableCode, String dateFormat);

  /**
   * 添加数据获取详情记录
   * @param data  数据详情
   * @param mission 任务详情
   * @param dataType  数据类型
   * @param deviceInfo  设备详情
   * @param dateFormat  格式化时间
   * @param code        记录表code
   * @param dateFormatYmdHms  具体时间
   * @param sendCode  限时code
   * @param missionSessionCode  任务发送限时code
   */
  void insertHistoryDataGetDetail(DataOperationInfo data, MissionInfo mission, String dataType,
      DeviceInfo deviceInfo, String dateFormat, String code, String dateFormatYmdHms, String sendCode, String missionSessionCode);

  /**
   * 更新数据获取详情表
   * @param code  code
   * @param status  使用状态
   * @param dateFormat  格式化后的时间
   */
  void updateHistoryDataGetDetail(String code, boolean status, String dateFormat);

  /**
   * 添加任务获取详情记录表数据
   * @param missionSendCode 任务发送code,限时code
   * @param missionInfo 任务详情
   * @param deviceInfo  设备详情
   * @param dateFormat  格式化后时间
   * @param dateFormatYmdHms  具体时间
   */
  void insertMissionGetHistory(String missionSendCode, MissionInfo missionInfo,
      DeviceInfo deviceInfo, String dateFormat, String dateFormatYmdHms);

  /**
   * 更新任务发送表记录
   * @param missionSendCode 任务发送code,限时那个
   * @param dateFormat      格式化后时间
   * @param status          处理状态
   * @param request         请求参数全量数据
   * @param createDate      任务创建时间
   */
  void updateHistoryMissionGetDetail(String missionSendCode, String dateFormat, Boolean status, ClientMissionCompleteRequestDTO request, Date createDate);

  /**
   * 获取数据导入时的文件里面的列名表头
   * @param sourceCode  数据源code
   * @return  文件的表头集合
   */
  List<DataImportHeadInfo> getImportFileHeader(String sourceCode);
}
